Vue Provide/Inject

বড় প্রকল্পে এক উপাদান থেকে অন্য উপাদানে ডেটা পাস করুন

Vue Provide/Inject

Vue-তে প্রদান/ইনজেক্ট ব্যবহার করা হয় একটি উপাদান থেকে অন্যান্য উপাদানগুলিতে, বিশেষত বড় প্রকল্পগুলিতে ডেটা সরবরাহ করতে।

অন্যান্য উপাদানের জন্য উপলভ্য তথ্য প্রদান করে.

সরবরাহকৃত ডেটা পেতে ইনজেকশন ব্যবহার করা হয়।

প্রপস ব্যবহার করে ডেটা পাঠানোর বিকল্প হিসাবে ডেটা ভাগ করে নেওয়ার একটি উপায় প্রদান/ইনজেক্ট।

Provider

ডেটা প্রদান করে

provide() { return { foods: this.foods } }
ডেটা প্রবাহ

Injector

ডেটা পায়

inject: ['foods']

ধারণা প্রদান/ইনজেক্ট করুন

একটি বড় প্রকল্পে, উপাদানগুলির মধ্যে উপাদানগুলির সাথে, "App.vue" থেকে একটি সাব-কম্পোনেন্টে ডেটা পাস করার জন্য প্রপস ব্যবহার করা কঠিন হতে পারে কারণ প্রতিটি উপাদানে প্রপগুলিকে সংজ্ঞায়িত করা আবশ্যক যার মাধ্যমে ডেটা পাস করা হয়।

আমরা যদি props-এর পরিবর্তে provide/inject ব্যবহার করি, তাহলে আমাদের প্রদত্ত ডেটা শুধুমাত্র যেখানে এটি প্রদান করা হয়েছে এবং ইনজেকশন করা ডেটা শুধুমাত্র যেখানে এটি ইনজেকশন করা হয়েছে তা সংজ্ঞায়িত করতে হবে।

প্রপস (প্রথাগত পদ্ধতি)

ডেটা প্রতিটি উপাদানের মধ্য দিয়ে যেতে হবে

App → ComponentA → ComponentB → ComponentC

প্রপস অবশ্যই সমস্ত মধ্যবর্তী উপাদানগুলিতে সংজ্ঞায়িত করা উচিত

প্রদান/ইনজেকশন (সরাসরি পদ্ধতি)

ডেটা সরাসরি উপাদানগুলিতে যায়

App (provide) → ComponentC (inject)

মধ্যবর্তী উপাদানগুলির ডেটা পাস করার প্রয়োজন নেই

ডেটা প্রদান করুন

অন্যান্য উপাদানগুলিতে ডেটা উপলব্ধ করতে আমরা 'প্রদান' কনফিগারেশন বিকল্পটি ব্যবহার করি:

<template>
  <h1>Food</h1>
  <div @click="this.activeComp = 'food-about'" class="divBtn">About</div>
  <div @click="this.activeComp = 'food-kinds'" class="divBtn">Kinds</div>
  <div id="divComp">
    <component :is="activeComp"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeComp: 'food-about',
      foods: [
        { name: 'Pizza', imgUrl: '/img_pizza.svg' },
        { name: 'Apple', imgUrl: '/img_apple.svg' },
        { name: 'Cake', imgUrl: '/img_cake.svg' },
        { name: 'Fish', imgUrl: '/img_fish.svg' },
        { name: 'Rice', imgUrl: '/img_rice.svg' }
      ]
    }
  },
  provide() {
    return {
      foods: this.foods
    }
  }
}
</script>

উপরের কোডে, 'খাবার' অ্যারেটি এখন সরবরাহ করা হয়েছে যাতে এটি আপনার প্রকল্পের অন্যান্য উপাদানগুলিতে ইনজেক্ট করার জন্য উপলব্ধ।

💡প্রদান() ফাংশন:

provide() একটি ফাংশন হওয়া উচিত, যা একটি বস্তু প্রদান করে। এই ফাংশনের মধ্যে, আপনি 'this' ব্যবহার করে ডেটা(), কম্পিউটেড, বা পদ্ধতিগুলি থেকে বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন। প্রোভাইড() থেকে অবজেক্টের বৈশিষ্ট্যগুলি সমস্ত চাইল্ড উপাদানের (এবং তাদের বাচ্চাদের) জন্য উপলব্ধ।

ইনজেক্ট ডেটা

এখন যেহেতু 'খাবার' অ্যারে 'অ্যাপ.ভিউ'-তে 'প্রোভাইড' এর মাধ্যমে উপলব্ধ করা হয়েছে, আমরা এটিকে 'ফুডকিন্ডস' উপাদানে যুক্ত করতে পারি।

যেহেতু 'খাবার' ডেটা 'FoodKinds' উপাদানে প্রবেশ করানো হয়, তাই আমরা 'FoodKinds' উপাদানে বিভিন্ন খাবার প্রদর্শন করতে App.vue থেকে ডেটা ব্যবহার করতে পারি:

🎯উদাহরণ

আপনার নিজস্ব Vue সার্ভার পান

FoodKinds.vue:

<template>
    <h2>Different Kinds of Food</h2>
    <p><mark>In this application, food data is provided in "App.vue", and injected in the "FoodKinds.vue" component so that it can be shown here:</mark></p>
    <div v-for="x in foods">
        <img :src="x.imgUrl">
        <p class="pName">{{ x.name }}</p>
    </div>
</template>

<script>
export default {
    inject: ['foods']
}
</script>

<style scoped>
    div {
        margin: 10px;
        padding: 10px;
        display: inline-block;
        width: 80px;
        background-color: #28e49f47;
        border-radius: 10px;
    }
    .pName {
        text-align: center;
    }
    img {
        width: 100%;
    }
</style>

দ্রষ্টব্য: inject হল অ্যারের উপাদান সংজ্ঞাতে একটি বৈশিষ্ট্য। সরবরাহ করা ডেটা উপাদানটির একটি সম্পত্তি হিসাবে উপলব্ধ, যে নামে এটি সরবরাহ করা হয়েছিল।

Vue প্রদান/ইনজেক্ট টিউটোরিয়াল

নীচের কোডের অন্যান্য উপাদানের জন্য মাছের নাম 'Turbot' উপলভ্য করার জন্য কোন কনফিগারেশন বিকল্পের প্রয়োজন?

Vue প্রদান/ইনজেক্ট টিউটোরিয়াল

data() {
  return {
    fishName: 'Turbot',
    count: 4
  }
},
_____ {
  return {
    fishName: this.fishName
  }
}

নীচের বিকল্পগুলি থেকে সঠিক উত্তর চয়ন করুন:

inject
✗ ভুল! ইনজেক্ট ডেটা গ্রহণ করতে ব্যবহৃত হয়, এটি প্রদান করতে নয়
props
✗ ভুল! প্রপস উপাদানটি প্রপস সংজ্ঞায়িত করতে ব্যবহৃত হয়, প্রদান/ইনজেক্ট নয়
provide
✓ ঠিক আছে! প্রদান() ফাংশনটি অন্যান্য উপাদানগুলিতে ডেটা সরবরাহ করতে ব্যবহৃত হয়। এটি একটি বস্তু প্রদান করে যেখানে fishName এখন অন্যান্য উপাদানের জন্য উপলব্ধ
data
✗ ভুল! data() উপাদানটির জন্য অভ্যন্তরীণ ডেটা সংজ্ঞায়িত করে, তবে এটি অন্যান্য উপাদানগুলিতে প্রেরণ করে না

কখন প্রোভাইড/ইনজেক্ট ব্যবহার করবেন

বড় উপাদান গাছ:মাল্টি-লেভেল কম্পোনেন্ট আর্কিটেকচারে, সাইট জুড়ে ডেটা ছড়িয়ে দিন
বৈশ্বিক অবস্থা:গ্লোবাল স্ট্যাটাস ম্যানেজমেন্ট যেমন ব্যবহারকারীর প্রমাণীকরণ, থিম সেটিংস
প্লাগইন কনফিগারেশন:প্লাগইন বা তৃতীয় পক্ষের উপাদানগুলিতে কার্যকারিতা প্রদান করতে
জটিল ফর্ম:একাধিক উপ-উপাদানের সাথে জটিল আকারে ডেটা ভাগ করা
ছোট প্রকল্প:ছোট প্রকল্পে, প্রপস একটি আরও সহজ এবং সুস্পষ্ট সমাধান
সরাসরি উপাদান সম্পর্ক:মা-শিশু উপাদানের মধ্যে, প্রপস ভাল

প্রতিক্রিয়াশীল প্রদান

ডিফল্টরূপে, প্রদান/ইনজেক্ট প্রতিক্রিয়াশীল নয়। সরবরাহকৃত ডেটাতে পরিবর্তনগুলি ইনজেকশনের উপাদানগুলিতে প্রতিফলিত হয় না। প্রতিক্রিয়া পেতে, আপনাকে গণনাকৃত বৈশিষ্ট্য বা রেফ() মান প্রদান করতে হবে।

<script>
import { computed } from 'vue'

export default {
  data() {
    return {
      user: {
        name: 'John',
        age: 30
      }
    }
  },
  provide() {
    return {
      // Computed property for reactivity
      userName: computed(() => this.user.name),
      userAge: computed(() => this.user.age),
      
      // Method to update data reactively
      updateUser: (newName, newAge) => {
        this.user.name = newName
        this.user.age = newAge
      }
    }
  }
}
</script>

⚠️প্রতিক্রিয়া সতর্কতা:

রেন্ডার করা ডেটাকে রিঅ্যাকটিভ রাখতে, আপনাকে Vue 3-তে computed() বা ref() ব্যবহার করতে হবে। যদি আক্ষরিক মানগুলি ফেরত দেওয়া হয়, তবে তারা পরিবর্তনগুলি প্রতিফলিত করে না। উপাদানগুলির মধ্যে আপডেটযোগ্য ডেটা ভাগ করার জন্য পদ্ধতি বা ইভেন্টগুলি ব্যবহার করার কথা বিবেচনা করুন।

প্রপস প্রদান/ইনজেক্ট করুন - কখন ব্যবহার করতে হবে

বৈশিষ্ট্য Props Provide/Inject
ডেটা প্রবাহ মা → সরাসরি সন্তান পূর্বপুরুষ → যেকোনো শিশু (গাছের নিচে)
উপাদান সমাবেশ স্বচ্ছ এবং ট্রেস করা সহজ অন্তর্নিহিত, কম স্পষ্ট
কেস ব্যবহার করুন ক্ষুদ্র ও মাঝারি প্রকল্প বড় প্রকল্প, প্লাগইন ফ্রেমওয়ার্ক
প্রতিক্রিয়াশীলতা ডিফল্টরূপে প্রতিক্রিয়াশীল অতিরিক্ত পদক্ষেপ প্রয়োজন (গণনা করা/রেফ)
ওভারভিউ স্থানীয় দৃষ্টিকোণ (মা-শিশু) গ্লোবাল ওভারভিউ (গাছ জুড়ে)

🎯সাধারণ নির্দেশনা:

বেশিরভাগ ক্ষেত্রেই প্রপস পছন্দ করা উচিত কারণ সেগুলি আরও স্বচ্ছ এবং বজায় রাখা সহজ। শুধুমাত্র গাছের গভীরে থাকা উপাদানগুলিতে ডেটা পাঠাতে বা গ্লোবাল কনফিগারেশন সেটিংস প্রয়োগ করার প্রয়োজন হলেই প্রোভাইড/ইনজেক্ট ব্যবহার করুন।

একটি বাস্তব উদাহরণ

থিম সেটিংস পরিচালনা করতে কীভাবে প্রোভাইড/ইনজেক্ট ব্যবহার করা যেতে পারে তার একটি ব্যবহারিক উদাহরণ এখানে রয়েছে:

// ThemeProvider.vue - Root component
<script>
export default {
  data() {
    return {
      theme: 'light',
      themes: {
        light: { bg: '#fff', text: '#000' },
        dark: { bg: '#333', text: '#fff' }
      }
    }
  },
  provide() {
    return {
      theme: this.theme,
      currentTheme: () => this.themes[this.theme],
      toggleTheme: () => {
        this.theme = this.theme === 'light' ? 'dark' : 'light'
      }
    }
  }
}
</script>

// DeeplyNestedComponent.vue - Any child component
<script>
export default {
  inject: ['theme', 'currentTheme', 'toggleTheme'],
  methods: {
    applyTheme() {
      const theme = this.currentTheme()
      document.body.style.backgroundColor = theme.bg
      document.body.style.color = theme.text
    }
  }
}
</script>

এই উদাহরণে, থিম ডেটা রুট কম্পোনেন্টে উপস্থাপিত হয় এবং থিম ম্যানেজমেন্টকে কেন্দ্রীভূত করার জন্য মধ্যবর্তী উপাদানগুলিতে প্রপস পাস না করে গাছের যে কোনও জায়গায় যে কোনও শিশু উপাদানে ইনজেকশন করা যেতে পারে।